/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dao;

import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import pojo.Hoadon;
import pojo.Tinhtrang;
import util.HibernateUtil;

/**
 *
 * @author kydrenw
 */
public class HoadonDAO {
    
    /**
     * Lấy thông tin hóa đơn dựa vào Mã hóa đơn truyền vào.
     * @param mahd Mã của hóa đơn cần lấy thông tin.
     * @return  Nếu thành công trả về đối tượng hóa đơn cần tìm,
     * trả về null nếu thất bại.
     */
    public static Hoadon layThongTin(int mahd) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        Hoadon sp = (Hoadon) session.get(Hoadon.class, mahd);
        //
        return sp;
    }
    
    /**
     * Lấy danh sách tất cả hóa đơn.
     * @return  Danh sách các hóa đơn tìm thấy.
     */
    public static List<Hoadon> layDanhSach() {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        String hql = "FROM Hoadon";
        Query query = session.createQuery(hql);
        List<Hoadon> ds = query.list();
        for (int i = 0; i < ds.size(); i++) {
            ds.get(i).calSum();
            HoadonDAO.capNhatHoaDons(ds.get(i));
        }

        return ds;
    }

    /**
     * Them 1 hoa don vao csdl.
     * @param hoaDon thong tin hoa don can them vao.
     * @return true neu thanh cong, False neu that bai.
     */
    public static Boolean themHoaDon(Hoadon hoaDon) {
        Boolean result = true;
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        Transaction trans = session.getTransaction();
        String hql = "select max(mahd) from Hoadon";

        try {
            trans.begin();
            int mahd = 1;
            
            //Lấy mã số lớn nhất trong danh sách hóa đơn hiện tại
            if (session.createQuery(hql).list().get(0) == null || session.createQuery(hql).list().isEmpty()) {
                mahd = 1;
            } else {
                mahd = (Integer) session.createQuery(hql).uniqueResult();
            }
            
            // Tăng mã hóa đơn và gán cho hóa đơn mới
            hoaDon.setMahd(mahd + 1);
            hoaDon.setTinhtrang(new Tinhtrang(7));

            // Lưu hóa đơn mới vào CSDL
            session.save(hoaDon);
            trans.commit();

        } catch (Exception ex) {
            result = false;
            System.out.println(ex.getMessage());
        } 
        return result;
    }

    /**
     * Lấy danh sách các hóa đơn của người dùng dựa theo tham số truyền vào
     * @param username: Tên đăng nhập cảu người dùng cần lấy hóa đơn.
     * @param number Số lượng hóa đơn cần lấy
     * @return Nếu thành công --> danh sách hóa đơn tìm thấy
     * Nếu thất bại --> null
     */
    public static List<Hoadon> layHoaDons(String username, int number) {
        List<Hoadon> result = null;
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        Transaction trans = session.getTransaction();
        String hql = "from Hoadon where tendangnhap=:username and xoa=0 order by ngaydh desc";

        try {
            trans.begin();
            Query qr = session.createQuery(hql);
            
            // set tham số cho câu truy vấn
            qr.setString("username", username);
            
            // Set số lượng đối tượng trả về
            qr.setFirstResult(0);
            qr.setMaxResults(number);
            result = qr.list();
            trans.commit();
            
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
            result = null;
        } finally {
            if (session != null) {
            }
        }

        return result;
    }

    /**
     * Hủy hóa đơn có mã truyền vào theo yêu cầu của người dùng.
     * @param maHoaDon : mã của hóa đơn muốn hủy.
     * @return: true nếu thành công,false nếu thất bại.
     */
    public static Boolean huyHoaDons(int maHoaDon) {
        Boolean result = true;
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        Transaction trans = session.getTransaction();

        try {
            trans.begin();
            Hoadon hoaDon = (Hoadon) session.get(Hoadon.class, maHoaDon);
            hoaDon.getTinhtrang().setMa(9);
            session.update(hoaDon);
            trans.commit();
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
            result = false;
        } finally {
            if (session != null) {
            }
        }

        return result;
    }

    /**
     * Hủy hóa đơn theo yêu cầu của admin.
     * @param maHoaDon: mã hóa đơn muốn hủy
     * @return: true nếu thành công, false nếu thất bại
     */
    public static Boolean huyHoaDons_byAdmin(int maHoaDon) {
        Boolean result = true;
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        Transaction trans = session.getTransaction();

        try {
            trans.begin();
            Hoadon hoaDon = (Hoadon) session.get(Hoadon.class, maHoaDon);
            hoaDon.setTinhtrang(new Tinhtrang(10));
            session.update(hoaDon);
            trans.commit();
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
            result = false;
        } finally {
            if (session != null) {
            }
        }

        return result;
    }

    /**
     *Chuyển hóa đơn sang trạng thái đã duyệt.
     * @param maHoaDon : Mã hóa đơn được duyệt
     * @return: true nếu thành công, false nếu thất bại.
     */
    public static Boolean duyetHoaDons_byAdmin(int maHoaDon) {
        Boolean result = true;
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        Transaction trans = session.getTransaction();

        try {
            trans.begin();
            Hoadon hoaDon = (Hoadon) session.get(Hoadon.class, maHoaDon);
            hoaDon.setTinhtrang(new Tinhtrang(8));
            session.update(hoaDon);
            trans.commit();
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
            result = false;
        } finally {
            if (session != null) {
            }
        }

        return result;
    }

    /**
     * Cap nhat lai thông tin đơn đặt hàng.
     * @param hoaDon : Đối tượng chứa thông tin hóa đơn.
     * @return: true nếu thành công, false nếu thất bại.
     */
    public static Boolean capNhatHoaDons(Hoadon hoaDon) {
        Boolean result = true;
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        Transaction trans = session.getTransaction();

        try {
            trans.begin();
            session.update(hoaDon);
            trans.commit();
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
            result = false;
        } finally {
            if (session != null) {
            }
        }
        return result;
    }

    /**
     * Lấy danh sách hóa đơn theo ngày và theo tình trạng.
     * @param date : ngày cần lấy hóa đơn.
     * @param matt : tình trạng của những hóa đơn cần lấy.
     * @return      : Danh sách hóa đơn tìm thấy, null nếu không tìm thấy hoặc lỗi.
     */
    public static List<Hoadon> layDanhSach(String date, String matt) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        String hql = "";
        if (date==null || date.equals("")) {
            hql = "FROM Hoadon ";
            
            // Nếu đối số tinh trạng hợp lệ thì thêm vào câu truy vấn.
            if (!matt.equals("-1")) {
                hql += "where tinhtrang.ma=" + Integer.parseInt(matt);
            }
        } else {
            
            // Nếu ngày cần tìm hợp lệ thì thêm vào câu truy vấn.
            hql = "FROM Hoadon where ngaydh='" + date + "'";
            if (!matt.equals("-1")) {
                hql += "and tinhtrang.ma=" + Integer.parseInt(matt);
            }
        }

        Query query = session.createQuery(hql);
        List<Hoadon> ds = query.list();
        for (int i = 0; i < ds.size(); i++) {
            ds.get(i).calSum();
            HoadonDAO.capNhatHoaDons(ds.get(i));
        }

        return ds;
    }
}
